使用 .NET Framework 將資訊寫入 Windows 事件記錄檔
TLDR
- 使用
System.Diagnostics.EventLog類別可將應用程式訊息寫入 Windows 事件檢視器。 - 必須先檢查
Source是否存在,若不存在則需使用EventLog.CreateEventSource進行建立。 Source與LogName具有一對一關聯,一個Source只能對應一個LogName。- 若需變更
Source對應的LogName,必須刪除舊來源並建立新來源,且必須重新開機變更才會生效。 - 新增自訂記錄檔後,需重新開啟「事件檢視器」才能在介面上看到該記錄檔。
EventLog 核心概念
在 .NET Framework 中,System.Diagnostics.EventLog 是處理 Windows 事件記錄檔的主要類別。開發時需注意以下兩個參數:
- Source (來源):標示應用程式名稱。寫入前應先使用
EventLog.SourceExists(source)檢查,若不存在則需呼叫EventLog.CreateEventSource(source, logName)建立。 - LogName (記錄檔名稱):指定事件寫入的記錄檔分類。同一個
Source只能與單一LogName建立關聯。


寫入事件記錄檔
什麼情況下會遇到這個問題:當應用程式需要將執行狀態或錯誤訊息寫入系統日誌以便後續監控時。
基本寫入範例
csharp
string source = "MySource";
// 檢核 Source 是否存在,不存在就建立 Source
if (!EventLog.SourceExists(source)) {
// LogName 可以寫 Application 或 應用程式
EventLog.CreateEventSource(source, "Application");
}
// 寫入訊息
EventLog.WriteEntry(source, "MyMessage");
// 另一種寫法
using (EventLog log = new EventLog()) {
log.Source = source;
log.WriteEntry("MyMessage");
}執行結果: 
TIP
WriteEntry() 方法支援 EventLogEntryType 和 EventID 參數,可用於定義事件等級(如 Error, Warning, Information)及事件識別碼。
自訂記錄檔名稱
若需將事件寫入自訂的記錄檔,可將 LogName 指定為特定名稱。
csharp
string source = "MySource2";
if (!EventLog.SourceExists(source)) {
EventLog.CreateEventSource(source, "MyLogName");
}
EventLog.WriteEntry(source, "MyMessage");執行結果: 
WARNING
建立新的記錄檔後,必須重新開啟「事件檢視器」才能在介面上看到該記錄檔。
變更 Source 與 LogName 的關聯
什麼情況下會遇到這個問題:當需要將既有的應用程式來源重新導向至不同的記錄檔分類時。
若要更改 Source 所綁定的 LogName,必須先刪除舊的 Source 再重新建立。
csharp
string source = "MySource";
string logName = "MyLogName";
if (EventLog.SourceExists(source)) {
string oldLogName = EventLog.LogNameFromSourceName(source, ".");
if (oldLogName != logName) {
EventLog.DeleteEventSource(source);
EventLog.CreateEventSource(source, logName);
}
} else {
EventLog.CreateEventSource(source, logName);
}
EventLog.WriteEntry(source, "MyMessage");WARNING
根據 MSDN 文件說明,若來源已經對應到記錄檔,重新對應後必須重新開機電腦,變更才會生效。否則訊息仍會寫入舊的記錄檔中。
刪除記錄檔
若需移除不再使用的記錄檔,可使用以下方法:
csharp
EventLog.Delete(logName);參考資料
異動歷程
- 初版文件建立。